Freemarker模板的使用简介 您所在的位置:网站首页 freemarker assign用法实例 map Freemarker模板的使用简介

Freemarker模板的使用简介

2023-12-08 19:48| 来源: 网络整理| 查看: 265

需要的jar包:

在pom.xml文件中贴入

junit junit 4.12 test org.freemarker freemarker 2.3.23

练习的搭建

第一步:新建一个Maven项目;

第二步:在

标识位置创建一个新的包(存放模本文件的),本次事例:ftl(因为一般模板文件都是以.ftl结尾的)

模本文件内容展示

01.ftl

测试 你好${username}

 

02.ftl

Insert title here ${user.id}-----${user.name}-----${user.age} ${user.name}还是一个小孩 ${user.name}快成年 ${user.name}已经成年

 

03.ftl

这是list集合

Insert title here ${user.id}---------${user.name}-------${user.age}

 

 

04.ftl

Insert title here ${book?if_exists } ${(books.b)!"我是默认的"} ${date?string('yyyy-MM-dd')} //日期格式 ${number?string.number} 20 //三种不同的数字格式 ${number?string.currency} ${number?string.percent} //声明变量,插入布尔值进行显示 ${foo?string("yes","no")} ${book?cap_first} ${user.id}-------${user.name}------${user.group!} ${(user.group.name)!"1234"} ${(a.b)!"没有a.b元素"} 不为空 为空 阿里巴巴

 

还有创建两个测试用到的实体类:

package pojo; import java.io.Serializable; @SuppressWarnings("serial") public class User implements Serializable { private int id; private String name; private int age; private Group group; public Group getGroup() { return group; } public void setGroup(Group group) { this.group = group; } public User() { } public User(int id, String name, int age) { this.id = id; this.name = name; this.age = age; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }

 

 

package pojo; public class Group { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }

 

下面要创建一个工具类

package artro.freeMarker; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.util.Map; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; public class FreemarkerUtil { public Template getTemplate(String name){ try { //通过Freemarker的Configuration读取相应的ftl Configuration configuration = new Configuration(Configuration.VERSION_2_3_23);//这里是对应的你使用jar包的版本号:2.3.23 //configuration.setDirectoryForTemplateLoading(new File("/ftl")); //如果是maven项目可以使用这种方式 //第二个参数 为你对应存放.ftl文件的包名 configuration.setClassForTemplateLoading(this.getClass(), "/ftl"); Template template = configuration.getTemplate(name); return template; } catch (IOException e) { e.printStackTrace(); } return null; } public void print(String name,Map root){ //通过Template可以将模版文件输出到相应的文件流 Template template = this.getTemplate(name); try { template.process(root, new PrintWriter(System.out));//在控制台输出内容 } catch (TemplateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * 输出HTML文件 * * @param name * @param root * @param outFile */ public void fprint(String name, Map root, String outFile) { FileWriter out = null; try { // 通过一个文件输出流,就可以写到相应的文件中,此处用的是绝对路径 out = new FileWriter(new File("D:/new_works/freeMarker/src/static/" + outFile)); Template temp = this.getTemplate(name); temp.process(root, out); } catch (IOException e) { e.printStackTrace(); } catch (TemplateException e) { e.printStackTrace(); } finally { try { if (out != null) out.close(); } catch (IOException e) { e.printStackTrace(); } } } }

 

 下面是编写的测试类

package artro.freeMarker; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import org.junit.Before; import org.junit.Test; import pojo.Group; import pojo.User; public class FreemarkerTest{ FreemarkerUtil fu = null; @Before public void init(){ if(fu==null){ fu = new FreemarkerUtil(); } } @Test public void test1(){ //1.创建数据模型 Map root = new HashMap(); //2.赋值 root.put("user_name", "胖先生"); //3.将数据模型和模版进行结合输出到控制台显示 fu.print("demo.ftl", root); } @Test public void test2(){ Map root=new HashMap(); root.put("username", "王风");//在ftl中要赋值的变量 /*FreemarkerUtil util=new FreemarkerUtil(); */ fu.fprint("01.ftl", root, "01.html"); } @Test public void test3(){ Map root=new HashMap(); User user = new User(); user.setId(1011); user.setName("汪峰"); user.setAge(52); root.put("user", user);//在ftl中要赋值的变量 /*FreemarkerUtil util=new FreemarkerUtil(); */ fu.fprint("03.ftl", root, "01.html"); } @Test public void test4(){ Map root=new HashMap(); User user = new User(); user.setId(1011); user.setName("汪峰"); user.setAge(52); User user1 = new User(); user1.setId(1012); user1.setName("章子怡"); user1.setAge(15); List users = new ArrayList(); users.add(user); users.add(user1); root.put("users", users);//在ftl中要赋值的变量 fu.fprint("04.ftl", root, "04.html"); } @Test public void test5(){ Map root=new HashMap(); User user = new User(); user.setId(1011); user.setName("汪峰"); user.setAge(52); Group group = new Group(); group.setName("雅昌"); user.setGroup(group); root.put("user", user);//在ftl中要赋值的变量 root.put("book","美丽说"); fu.fprint("06.ftl", root, "06.html"); } @Test public void test6(){ Map root=new HashMap(); User user = new User(); user.setId(1011); user.setName("汪峰"); user.setAge(52); Group group = new Group(); group.setName("雅昌"); user.setGroup(group); Date date = new Date(); root.put("user", user);//在ftl中要赋值的变量 root.put("book","a美丽说"); root.put("date",date); int number = 21; root.put("number",number); Boolean foo = true; root.put("foo", foo); fu.fprint("06.ftl", root, "06.html"); } }

 

下面在贴出一些常用的语法

出处:http://www.cnblogs.com/linjiqin/p/3388298.html

FreeMarker的插值有如下两种类型:1,通用插值${expr};2,数字格式化插值:#{expr}或#{expr;format} ${book.name?if_exists } //用于判断如果存在,就输出这个值 ${book.name?default(‘xxx’)}//默认值xxx ${book.name!"xxx"}//默认值xxx ${book.date?string('yyyy-MM-dd')} //日期格式 ${book?string.number} 20 //三种不同的数字格式 ${book?string.currency}-- ${book?string.percent}—

//声明变量,插入布尔值进行显示 ${foo?string("yes","no")}

大小比较符号使用需要注意:(xml的原因),可以用于比较数字和日期 使用lt、lte、gt和gte来替代= 也可以使用括号y)>

内置函数: 调用区别于属性的访问,使用?代替. 常见的一些内置函数 对于字符串 html-对字符串进行HTML编码 cap_first-使字符串第一个字母大写 lower_case-将字符串转换成小写 trim-去掉字符串前后的空白字符

示例:${“freeMarker”?cap_first} 

 

对于Sequences(序列) size-获得序列中元素的数目

对于数字 int-取得数字的整数部分(如-1.9?int的结果是-1)

对于集合,可以使用数组的方式,使用下标索引进行访问

逻辑判断: if................

... ... ...... ... Boolean类型的空值判断 空值判断可以写成 //注意${}为变量的渲染显示,而为定义等操作符的定义

switch............   ...   ...  ...  ...   ... 

快速定义int区间的集合  //注意不需要[]

3:循环读取集合: 注意/的使用  ${stu}  与jstl循环类似,也可以访问循环的状态 item_index:当前变量的索引值 item_has_next:是否存在下一个对象 其中item名称为as后的变量名,如stu

集合长度判断  判断=的时候,注意只要一个=符号,而不是==

宏/模板 初步了解: 使用更像一个闭包closure,可以定义后,在脚本中任意地方引用,并原地起作用  Hello Joe!  使用的方式为:  //同xml可以简写成

宏的参数定义,类似js,在宏名后 带参数进行传递定义  ${person} 

调用带参数时,注意使用类似XML的属性格式进行传递,不需要关心顺序问题 

参数默认值定义,如果没有,就必须要求传递完整的参数列表  Hello ${person}! 

使用xml的嵌套内容进行传递宏调用,关键标签      

调用时: The bordered text

标签可以在宏中多次调用,也可以将多个宏组合进行嵌套

for循环的精简版:  

宏的循环变量,配合嵌套标签进行参数传递,    //这里的三个参数,将会传递到嵌套内容中  

 ${c}. ${halfc} Last! //这里的内容由macro中的进行参数的传递,传递的数量任意,当注意需要宏接受这些  上述还需要注意;的使用

参数的数量是可变的,并不要求全部都有,但是效果不同

在模板中定义变量 在模板中定义的变量有三种类型: plain变量:可以在模板的任何地方访问,包括使用include指令插入的模板,使用assign指令创建和替换。 局部变量:在宏定义体中有效,使用local指令创建和替换。 循环变量:只能存在于指令的嵌套内容,由指令(如list)自动创建;宏的参数是局部变量,而不是循环变量

//全局的plain变量 内部循环变量将会隐藏同名的外部循环变量

外部导入的使用,可以用于模块化,并且提供公用性 如:lib/my_lib.ftl文件  

Copyright (C) ${date} Julia Smith. All rights reserved. Email: ${mail}

  

lib/my_inc.ftl文件    ${my.mail} ${mail} 输出结果将不会出现冲突

对于库中的变量修改,使用in关键字 

函数定义:区别于宏对象,带返回值 函数,有返回参数

stringA[M .. N] 取子字符串,类似substring(stringA, M, N)

导入其他页面元素  options包含两个属性 encoding=”GBK” 编码格式 parse=true 是否作为ftl语法解析,默认是true,false就是以文本方式引入.注意在ftl文件里布尔值都是直接赋值的如parse=true,而不是

parse=”true”

hash与list的定义  ${c.a}

List片段可以采用: products[10..19] or products[5..] 的格式进行定义,当只局限于数字   ${v} 

对变量的缺省处理 product.color!"red"

用compress directive或者transform来处理输出。 ...:消除空白行。 ...将输出压缩为一行。都需要包裹所需文档

freemarker可用"["代替"



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有